package com.hedl.classroom.service;

import com.hedl.classroom.base.exception.CommonResult;
import com.hedl.classroom.base.model.PageParams;
import com.hedl.classroom.base.model.PageResult;
import com.hedl.classroom.model.dto.QueryMediaParamsDto;
import com.hedl.classroom.model.dto.UploadFileParamsDto;
import com.hedl.classroom.model.dto.UploadFileResultDto;
import com.hedl.classroom.model.po.MediaFiles;

import java.io.File;

/**
 * ProjectName: onlinec-classroom
 * DateTime: 2023/7/10 17:49
 * Author: Big Watermelon
 * Description: 媒资文件管理业务类
 */
public interface MediaFileService {

    /**
     * 根据媒资id查询文件信息
     * @param mediaId 媒资id
     * @return
     */
    MediaFiles getFileById(String mediaId);

    /**
     * 媒资文件查询方法
     * @param companyId 机构id
     * @param pageParams    分页参数
     * @param queryMediaParamsDto   查询条件
     * @return
     */
    PageResult<MediaFiles> queryMediaFiels(Long companyId, PageParams pageParams, QueryMediaParamsDto queryMediaParamsDto);

    /**
     * 上传文件
     * @param companyId 机构id
     * @param uploadFileParamsDto 文件信息
     * @param bytes 文件字节数据
     * @param folder 桶下边的子目录
     * @param objectName 对象名称
     * @return
     */
    UploadFileResultDto uploadFile(Long companyId, UploadFileParamsDto uploadFileParamsDto, byte[] bytes, String folder, String objectName);

    /**
     * 将文件信息添加到文件表
     * @param companyId             机构id
     * @param uploadFileParamsDto   上传文件的信息
     * @param objectName            对象名称
     * @param fileMD5               文件的md5码
     * @param bucket                桶
     * @return
     */
    MediaFiles addMediaFilesToDB(Long companyId, UploadFileParamsDto uploadFileParamsDto, String objectName, String fileMD5, String bucket);


    /**
     *检查文件是否存在
     * @param fileMd5 文件的md5
     * @return
     */
    CommonResult<Boolean> checkFile(String fileMd5);

    /**
     * 检查分块是否存在
     * @param fileMd5 文件的md5
     * @param chunkIndex 分块序号
     * @return
     */
    CommonResult<Boolean> checkChunk(String fileMd5,int chunkIndex);

    /**
     * 上传分块
     * @param fileMd5 文件md5
     * @param chunk 分块序号
     * @param bytes 本地分块文件字节数据
     * @return
     */
    CommonResult uploadChunk(String fileMd5,int chunk,byte[] bytes);

    /**
     * 合并分块
     * @param companyId 机构id
     * @param fileMd5 文件md5
     * @param chunkTotal 分块总和
     * @param uploadFileParamsDto 文件信息
     * @return
     */
    CommonResult mergeChunks(Long companyId,String fileMd5,int chunkTotal,UploadFileParamsDto uploadFileParamsDto);

    /**
     * 从minio中下载文件
     * @param file 目标文件
     * @param bucket 桶
     * @param objectName 桶内文件路径
     * @return
     */
    public File downloadFileFromMinio(File file, String bucket, String objectName);
}
